point-free style
引数を省略した関数を.演算子で合成関数をつくることで関数を定義する
やりすぎ禁物
poinrtfreeに変換する
手順
カッコで括る
$でカッコを外す
.で関数合成
例
code:hs
-- ":t hoge"という文字列を"hoge"に変換する関数
eliminate cmd = drop 1 (dropWhile (> ' ') cmd) -- カッコで括る
eliminate cmd = drop 1 $ dropWhile (> ' ') cmd -- $にする
eliminate = drop 1 . dropWhile (> ' ') -- .にする
コツ
記号を関数としてみる
x == yを(==) x yとしてみる
f >>= xを(>>=) f xとしてみる
という感じ
foo x = f . g xという関数を
foo x = (f .) (g x)とカッコを付けて読む
するとfoo = (f .) . gと変換できる
なにがうれしい?
きれい
これとかできる?
bind a b vs = Map.insert (fromJust $ Map.lookup b vs) a vs
Mapであるvsのうち、bの値をaの値にする
[(a,1), (b,2)]→[(a,2),(b,2)]
vsが2箇所で出てきている
Pointfreeにするかどうかで評価回数が変わることがある
つまり、Pointfreeにしないとパフォ劣化があり得る例がある
問題になるほどのパフォ劣化かどうかは知らんけど
良い練習になる
最初に読むと良いかも
問題もいくつもある
eqShow x y = show (x==y) ref 可読性がむちゃくちゃ落ちるような極端な例なので、実用的ではないが練習には良いmrsekut.icon
参考